interface TableInterface {
  columns: ColumnItem[]
  data: any[]
  tableConfig: TableConfig
}

interface ColumnItem {
  prop?: string
  label: string
  width?: number
  height?: number
  fixed?: boolean
  align?: 'left' | 'center' | 'right'
  wordBreak?: number
  render?: (row: any, column: ColumnItem, index: number) => any
  sortable?: boolean
  sortMethod?: (a: any, b: any) => number
  // resizable?: boolean; // 列是否可拖动调整宽度
  showOverflowTooltip?: boolean
  formatter?: (row: any, column: ColumnItem) => string
  classNames?: any
  selectable?: (row: any, index: number) => boolean
  reserveSelection?: boolean
  cellClassName?: any
  cellStyle?: any
  headerClassName?: any
  children?: ColumnItem[]
  filterMethod?: (value: any, row: any) => boolean
  filterMultiple?: boolean
  filteredValue?: any[]
  filterOpened?: boolean
  currentRowKey?: any
  rowKey?: any
}

type TableConfig = {
  hooks?: Partial<TableHooks>
  header?: Partial<HeaderConfig>
  body?: Partial<BodyConfig>
  // parseClass?: new () => TableParseInterface
}

interface TableCell {
  minWidth: number
  minHeight: number
  width: number
  height: number
  fillColor: string
  borderWidth: number
  borderColor: string
  padding: number[] | number
}
interface TableCellText {
  textBaseline: 'middle' | 'top' | 'bottom'
  textAlign: 'left' | 'center' | 'right' | 'start' | 'end'
  fontSize: number
  fontColor: string
  fontFamily: string
  fontWeight?: string | number
  fontStyle?: 'normal' | 'italic'
  // 文本方向
  direction?: 'ltr' | 'rtl'
  lineHeight?: number
}
interface TableHeaderHooks {
  onBeforeParseHeader?(columns: ColumnItem[], config: Partial<HeaderConfig>): void
  onParseHeaderCol?(row: any, col: any, rowIndex: number, colIndex: number): void
  onAfterParseHeader?: (headerParseResult: headerParseResult) => void
}
interface TableBodyHooks {
  onBeforeParseBody?(data: any[], config: Partial<BodyConfig>): void
  onBeforeParseBodyRow?(row: any, rowIndex: number): void
  onAfterParseBodyCell?(
    cellValue: any,
    rowIndex: number,
    colIndex: number,
    dataParseResult: any
  ): void
  onAfterParseBody?: (bodyParseResult: BodyParseResult) => void
}
// 表格钩子函数接口
interface TableHooks {
  onBeforeParse?(table: TableInterface): void
  // 表格解析完成后钩子函数类型
  onAfterParse?: (parseResult: { header: headerParseResult; data: BodyParseResult }) => void
}
interface HeaderConfig {
  fit?: boolean
  border?: boolean
  cell?: Partial<TableCell>
  cellText?: Partial<TableCellText>
  hooks?: Partial<TableHeaderHooks>
}
interface BodyConfig {
  border?: boolean
  stripe?: boolean
  stripeFillColor?: string
  cell: Partial<TableCell>
  cellText: Partial<TableCellText>
  hooks?: Partial<TableBodyHooks>
  // 合并单元格的逻辑;返回数组或者一个对象，对象格式为{rowspan:number, colspan:number} 或 [rowspan, colspan]
  spanMerge?: (
    colIndex: number,
    rowIndex: number
  ) => number[] | { rowspan: number; colspan: number }
}

interface headerParseResult {
  headerWidth: number
  headerHeight: number
  parseResult: {
    cellStyle: CellStyleInterface | null
    cellTextStyle: CellTextStyleInterface | null
    parseData: tableCellItem[]
  }
}
interface tableCellItem {
  width: number
  height: number
  content: (TextData | ImageData)[]
  location: {
    x: number
    y: number
  }
  cellStyle?: CellStyleInterface
  cellTextStyle?: CellTextStyleInterface
}
interface TextData {
  type: 'text'
  text: string
  location: { x: number; y: number }
}

interface ImageData {
  type: 'image'
  imgUrl: string
  imgWidth: number
  imgHeight: number
  location: { x: number; y: number }
}

// 单元格样式 canvas 渲染样式
interface CellStyleInterface {
  fillStyle: string
  strokeStyle?: string
  lineWidth?: number
}
// 单元格文本样式 canvas 渲染样式
interface CellTextStyleInterface {
  fillStyle: string
  fontSize?: string
  fontFamily?: string
  fontWeight?: string
  fontStyle?: 'normal' | 'italic'
  textBaseline?: 'top' | 'middle' | 'bottom'
  textAlign?: 'left' | 'center' | 'right'
  // 文本方向
  direction?: 'ltr' | 'rtl'
  lineHeight?: number
}
interface BodyParseItem {
  bodyWidth: number
  itemHeight: number
  parseData: tableCellItem[]
}

type BodyParseResult = BodyParseItem[]

interface SpecialColumnConfig {
  // 特殊列的唯一标识符
  id: string
  // 特殊列的标题
  label: string
  // 特殊列的数据属性名
  prop: string
  // 特殊列的宽度，如果未指定则使用默认宽度计算逻辑
  width?: number
  // 特殊列的高度，如果未指定则使用默认高度计算逻辑
  height?: number
  // 特殊列的对齐方式，如'left'、'center'、'right'
  align?: 'left' | 'center' | 'right'
  // 特殊列是否可编辑，默认为false
  editable?: boolean
  // 特殊列的数据验证规则，例如一个正则表达式或验证函数
  validationRule?: RegExp | ((value: any) => boolean)
  // 特殊列的自定义样式对象，包含各种CSS样式属性
  customStyle?: {
    backgroundColor?: string
    color?: string
    fontWeight?: string
    fontSize?: number
    // 其他样式属性根据需要添加
  }
  // 特殊列的数据转换函数，用于在解析数据时对该列的值进行转换
  dataTransformer?: (value: any) => any
  // 特殊列的点击事件处理函数，如果需要在用户点击该列时执行特定操作
  onClick?: (event: MouseEvent, rowData: any) => void
  // 特殊列是否可见，默认为true
  visible?: boolean
  // 特殊列是否可排序，默认为false
  sortable?: boolean
  // 特殊列的排序比较函数，如果可排序，则用于定义该列的排序规则
  sortComparator?: (a: any, b: any) => number
  // 特殊列是否可冻结，即是否固定在表格的左侧或右侧，默认为false
  frozen?: boolean
  // 特殊列是否支持合并单元格，默认为false
  mergeCells?: boolean
  // 如果支持合并单元格，合并的行数或列数，根据具体需求确定如何使用该属性
  mergeSpan?: number
  // 特殊列是否支持展开/折叠功能，默认为false
  expandable?: boolean
  // 特殊列展开时的详细信息配置，例如一个包含更多数据的对象或函数
  expandDetails?: any
  // 特殊列是否需要懒加载数据，默认为false
  lazyLoad?: boolean
  // 懒加载数据的函数，如果启用懒加载，则用于获取该列的数据
  lazyLoadData?: () => Promise<any>
  // 特殊列是否支持虚拟滚动，默认为false
  virtualScroll?: boolean
  // 虚拟滚动相关配置，例如缓冲区大小等
  virtualScrollConfig?: { bufferSize: number; itemHeight: number }
}

export {
  TableInterface,
  ColumnItem,
  TableConfig,
  headerParseResult,
  BodyParseResult,
  SpecialColumnConfig,
  HeaderConfig
}
